package connexionServer;
//******************************************************************************
// Server.java
// E.Lefrancois 1er janvier 2000
// Projet "Chat"
//******************************************************************************

import java.util.*;
import java.net.*;
import java.lang.System;
import java.io.*;

import LecteurMp3.MultiPlayer;
import bdd.DBConnection;

// Pour acces a SQL
//import java.sql.*;
//import java.net.URL;

//==============================================================================
// Application de type "Standalone"
// Le serveur est un objet actif.
// Cet objet attend des requetes de connexion.  A cette fin, une instance de
// "ServerSocket" est creee.  Cette insatnce attend une demande de connexion
// et retourne une socquette associee a cette connexion.
// Une fois que la socquette est creee, le programme cree une instance de
// "Connection".  Cette instance sera responsable de la communication avec le
// client.  Cette "Connection" est ajoutee a la liste dynamique rassemblant
// toutes les connexions.
//
// Enfin, le serveur cree une instance de "ConnectionsController", un objet
// responsable de controler periodiquement chacune des connexions, et de retirer
// de la liste toute connexion qui serait reperee inactive.
//==============================================================================
public class Serveur implements Runnable  {

	private Thread      activite = null;       // Activite associee

	private Vector<Connexion>      listeDesConnexions;// Liste des connexions avec
	// les clients

	private Hashtable<String, Integer> credits; // Liste des imei et de leurs credits
	// associes.
	
	// Reference au programme principal, permettant les actions depuis les smartphones
	private DBConnection databaseConnection;
	private MultiPlayer jukeBox;

	private ServerSocket socketServeur;
	// La "socketServeur" attend des demandes de connexions operees
	// sur le no de port associe.
	// La taille de la queue d'entree est de 50 (nombres max. de demandes
	// de connexion en attente).

	private ControleurConnexions leControleurDesConnexions;
	// Pour controler periodiquement
	// l'activite de chaque connexion

	private static final int NO_PORT = 5002;
	// No de port associe a ce service

	// Constructeur
	public Serveur(DBConnection dbc, MultiPlayer m) {
		databaseConnection = dbc;
		jukeBox = m;
		listeDesConnexions = new Vector<Connexion>();
		credits = new Hashtable<String, Integer>();
		leControleurDesConnexions = new ControleurConnexions (listeDesConnexions,credits,databaseConnection, jukeBox);

		try {
			socketServeur = new ServerSocket (NO_PORT);
		}
		catch (IOException e) {
			System.err.println (e.getMessage());
			System.exit(1);  // Status == "1" pour signaler
					// une terminaison anormale de l'application
		}
		activite = new Thread (this);
		activite.start();
	}

	public void run () {
		//System.out.println ("Attend une nouvelle connexion TCP...........");
		while (true) {
			try {
				// Attendre une nouvelle connexion
				Socket nouvelleSocket = socketServeur.accept();
				// Attend qu'une demande de connexion soit recue par
				// cette socket, et accepte cette demande
				// Cette methode bloque l'activite jusqu'a ce qu'une
				// connexion soit faite
				Connexion nouvelleConnexion =
						new Connexion (nouvelleSocket,
								leControleurDesConnexions,
								listeDesConnexions);
				synchronized (listeDesConnexions) {
					listeDesConnexions.addElement (nouvelleConnexion);
				}
			}
			catch (IOException e) {
				System.err.println (e.getMessage());
				System.exit (1);
			}
		}
		
	}
}

